home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 726-750 / 727 / 2view / source / 2viewasm.a < prev    next >
Text File  |  1995-03-18  |  8KB  |  301 lines

  1.  
  2. ;This is the assembler source for the 2View function ReadIntoBitmap()
  3. ;
  4. ;Parameters:
  5. ;  a0.l - The destination bitmap's PLANEPTR structure
  6. ;  a1.l - The source buffer
  7. ;  a2.l - The pointer to the IFFParse structure
  8. ;
  9. ;  d0.l - The length of the source buffer
  10. ;  d1.l - The number of bytes per bitmap row
  11. ;  d2.w - The number of rows in the bitmap
  12. ;  d3.b - The number of bitplanes in the bitmap
  13. ;  d4.b - 0 if the source isn't compressed, 1 if it is
  14. ;  d5.b - 1 if there's masking, 0 if not
  15. ;
  16. ;Returns:
  17. ;  Nothing
  18. ;
  19. ;Bugs:
  20. ;  Doesn't check ReadChunkBytes() return value
  21.  
  22.  
  23.         xref _LVOCopyMem
  24.         xref _LVOReadChunkBytes
  25.         xref _DOSBase
  26.         xref _IFFParseBase
  27.         xref _SysBase
  28.         xref _trashBuf
  29.  
  30.         xref _storage
  31.  
  32.         xdef _ReadIntoBitmapAsm
  33.  
  34.         SECTION "program",code
  35.  
  36. _ReadIntoBitmapAsm:
  37.         nop
  38.         nop
  39.         nop
  40.  
  41.         move.l   4(a7),planePtr
  42.         move.l   8(a7),srcStart   ;Store start of buffer
  43.         move.l   12(a7),iff        ;Store the IFFParse struct pointer
  44.  
  45.         move.l   16(a7),(sourceBufSize)
  46.         move.l   20(a7),bytesInRow
  47.         move.l   24(a7),d0         ;Masking
  48.         move.w   d0,Height
  49.         move.l   28(a7),d0
  50.         lsl.b    #2,d0
  51.         move.b   d0,Depth
  52.         move.l   32(a7),d0
  53.         move.b   d0,comp
  54.         move.l   36(a7),d0
  55.  
  56.         movem.l  a2/a4-a6/d2-d4/d7,-(a7)
  57.  
  58.         movea.l  srcStart,a2       ;Create the current source buf ptr
  59.         adda.l   (sourceBufSize),a2
  60.         movea.l  a2,a5           ;Create the end-of-source ptr
  61.  
  62.         moveq.l  #0,d2
  63.         clr.l    byteOffset
  64.         move.b   Depth,d3
  65.         tst.b    d0            ;Check masking
  66.         beq      storeMask
  67.         subq.b   #4,d3           ;Store the mask plane number
  68.  
  69. storeMask:  move.b   d3,maskPlaneNum
  70.  
  71.         clr.w    curRow           ;Clear the current row variable
  72.  
  73.         tst.b    comp           ;Test the compression flag
  74.         beq      uncompressed      ;If 0 no compression
  75.  
  76. nextRow:    moveq.l  #0,d4           ;Start of bitplane loop
  77.  
  78. nextPlane:
  79.         cmp.b    maskPlaneNum,d4   ;If it isn't the mask plane...
  80.         bne      getBitplane       ;Get the destination bitmap pointer
  81.         movea.l  _trashBuf,a4      ;Else, get a pointer to a bit bucket
  82.         bra      getBytes
  83.  
  84. getBitplane:
  85.         movea.l  planePtr,a0
  86.         movea.l  0(a0,d4),a4
  87.         adda.l   byteOffset,a4
  88.         move.l   a4,d7
  89.         add.l    bytesInRow,d7     ;Create the end-of-row pointer
  90.  
  91. getBytes:
  92.         cmpa.l   a2,a5
  93.         bne      checkCompType
  94.  
  95.         bsr      refillSrcBuffer
  96.         bmi      error
  97.  
  98. checkCompType:
  99.         moveq.l  #0,d2
  100.         move.b   (a2)+,d2          ;Get the current byte
  101.         cmp.b    #128,d2
  102.         beq      getBytes           ;Check for a NOP
  103.         cmp.b    #0,d2           ;Check to see if the byte specifies
  104.         blt      fillMem           ;a fill...
  105.  
  106.         addq.b   #1,d2           ;We need to copy d2+1 bytes
  107.         move.l   a5,d3           ;Check to see if the source buffer
  108.         sub.l    a2,d3           ;contains all the bytes we need to
  109.         cmp.l    d2,d3           ;copy
  110.         bpl      copyAll           ;If so, copy them
  111.  
  112.         ;Otherwise, copy the number of bytes available
  113.         movea.l  a2,a0
  114.         movea.l  a4,a1
  115.         move.l   d3,d0
  116.         movea.l  _SysBase,a6
  117.         jsr      _LVOCopyMem(a6)
  118.  
  119.         ;Add the number of bytes copied to the destination pointer
  120.         adda.l   d3,a4
  121.  
  122.         sub.b    d3,d2           ;Determine how many bytes are left
  123.                        ;to copy
  124.  
  125.         bsr      refillSrcBuffer
  126.         bmi      error
  127.  
  128. ;Copy a given number of bytes from the source to destination
  129. copyAll:
  130.         movea.l  a2,a0           ;Setup for CopyMem()
  131.         movea.l  a4,a1
  132.         move.l   d2,d0
  133.         movea.l  _SysBase,a6
  134.         jsr      _LVOCopyMem(a6)
  135.  
  136.         adda.l   d2,a4           ;Update destination pointer
  137.         adda.l   d2,a2           ;Update source pointer
  138.  
  139.         bra      nextCompByte
  140.  
  141. fillMem:    neg.b    d2
  142.         cmpa.l   a5,a2        ;See if source buffer is empty
  143.         bne      getFillByte
  144.  
  145.         bsr      refillSrcBuffer
  146.         bmi      error
  147.  
  148. getFillByte:
  149.         move.b   (a2)+,d0       ;Get the fill byte
  150.  
  151. doFill:
  152.         move.b   d0,(a4)+       ;Do the fill
  153.         dbra     d2,doFill
  154.  
  155. nextCompByte:
  156.         cmp.l    a4,d7        ;Check to see if we've written the
  157.         bne      getBytes        ;entire row
  158.         bra      checkLoop        ;If so, get the next row
  159.  
  160. checkLoop:
  161.         ;Check to see if we're done with all the planes in this row
  162.         addq.b   #4,d4        ;Increment the plane counter
  163.         cmp.b    Depth,d4        ;Compare to the # of planes
  164.         bne      nextPlane        ;If not equal, get next plane in row
  165.  
  166. setupNextRow:
  167.         move.l   byteOffset,d0  ;Update byte-offset value
  168.         add.l    bytesInRow,d0
  169.         move.l   d0,byteOffset
  170.  
  171.         addq     #1,curRow        ;Increment the row counter
  172.         move.w   curRow,d0        ;Check to see if we've run through
  173.         cmp.w    Height,d0        ;all the rows
  174.         bne      nextRow       ;If not, get the next row
  175.         bra      done
  176.  
  177.  
  178. ;Transfer a row (uncompressed)
  179. uncompressed:
  180. nextURow:   moveq.l  #0,d4           ;Start of bitplane loop
  181.  
  182. nextUPlane:
  183.         cmp.b    maskPlaneNum,d4   ;If it isn't the mask plane...
  184.         bne      getUBitplane      ;Get the destination bitmap pointer
  185.         adda.l   bytesInRow,a2     ;Else, skip past the mask plane
  186.         bra      setupNextRow      ;And go on to the next row
  187.  
  188. getUBitplane:
  189.         movea.l  planePtr,a0
  190.         movea.l  0(a0,d4),a4
  191.         adda.l   byteOffset,a4
  192.         move.l   a4,d7
  193.         add.l    bytesInRow,d7     ;Create the end-of-row pointer
  194.  
  195. getUBytes:
  196.         cmpa.l   a2,a5
  197.         bge      moveBytes
  198.  
  199.         bsr      refillSrcBuffer
  200.         bmi      error
  201.  
  202. moveBytes:
  203.         move.l   a5,d2        ;Check to see if all the bytes we need
  204.         sub.l    a2,d2        ;are in the source buffer
  205.         cmp.l    bytesInRow,d2
  206.         bge      noCompXfer
  207.  
  208.         move.l   d2,d0        ;Setup registers
  209.         movea.l  a2,a0
  210.         movea.l  a4,a1
  211.         movea.l  _SysBase,a6
  212.         jsr      _LVOCopyMem(a6)
  213.  
  214.         adda.l   d2,a4        ;Update destination pointer
  215.         move.l   bytesInRow,d0
  216.         sub.l    d2,d0
  217.         move.l   d0,d2
  218.  
  219.         bsr      refillSrcBuffer
  220.         bmi      error
  221.         bra      xfer_nc        ;Transfer the rest
  222.  
  223. noCompXfer:
  224.         ;Setup to transfer all the bytes in the row
  225.         move.l   bytesInRow,d2  ;row
  226.  
  227. xfer_nc:    movea.l  a2,a0        ;Transfer the given number of bytes
  228.         movea.l  a4,a1
  229.         move.l   d2,d0
  230.         movea.l  _SysBase,a6
  231.         jsr      _LVOCopyMem(a6)
  232.  
  233.         adda.l   d2,a2        ;Update the src pointer
  234.  
  235.         ;Check to see if we're done with all the planes in this row
  236.         addq.b   #4,d4        ;Increment the plane counter
  237.         cmp.b    Depth,d4        ;Compare to the # of planes
  238.         bne      nextUPlane     ;If not equal, get next plane in row
  239.  
  240. setupNextURow:
  241.         move.l   byteOffset,d0  ;Update byte-offset value
  242.         add.l    bytesInRow,d0
  243.         move.l   d0,byteOffset
  244.  
  245.         addq     #1,curRow        ;Increment the row counter
  246.         move.w   curRow,d0        ;Check to see if we've run through
  247.         cmp.w    Height,d0        ;all the rows
  248.         bne      nextURow        ;If not, get the next row
  249.  
  250. done:
  251.         moveq.l  #0,d0
  252.         bra      return
  253.  
  254. error:
  255.         moveq.l  #0,d0
  256.  
  257. return:
  258.         ;Restore registers
  259.         movem.l  (a7)+,a2/a4-a6/d2-d4/d7
  260.  
  261.         rts             ;And we're done
  262.  
  263.  
  264. refillSrcBuffer:
  265.         movea.l  iff,a0
  266.         movea.l  srcStart,a1
  267.         movea.l  a1,a2
  268.         move.l   sourceBufSize,d0
  269.         movea.l  _IFFParseBase,a6
  270.         jsr      _LVOReadChunkBytes(a6)
  271.         movea.l  a2,a5
  272.         adda.l   d0,a5
  273.         tst.l    d0
  274.         rts
  275.  
  276.         SECTION  "data",data
  277.  
  278.         CNOP     0,4
  279.  
  280. planePtr:   dc.l     0
  281. srcStart:   dc.l     0
  282. bytesInRow: dc.l     0
  283. byteOffset: dc.l     0
  284. iff:        dc.l     0
  285. sourceBufSize:
  286.         dc.l     0
  287.  
  288. Height:     dc.l     0
  289. curRow:     dc.w     0
  290.  
  291. plane:        dc.b     0
  292. maskPlaneNum:
  293.         dc.b     0
  294. Depth:        dc.b     0
  295.  
  296. comp:        dc.b     0
  297.  
  298.         END
  299.  
  300.  
  301.